package org.example;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.LocalDateTimeUtil;
import cn.hutool.crypto.digest.DigestUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;

public class AuthAesUtil {
    private static final Logger log =
            LoggerFactory.getLogger(AuthAesUtil.class);
    /**
     * 解密
     *
     * @param str 字符串
     * @param times request header Times
     * @param checkExpire 是否校验传入的时间与系统时间的差异
     * @return 解密后字符串
     */
    public static String decrypt(String str, String times, Boolean checkExpire)
    {
        try {
            String key = encodeTime(times,checkExpire);
            return new AesUtil(key).decryptData(str);
        } catch (Exception e) {
            log.error("字符串:{}解密错误，错误信息为:{}",str,e.getMessage());
        }
        return "";
    }
    /**
     * 加密
     *
     * @param str 加密前的字符串
     * @param times request header Times
     * @param checkExpire 是否校验传入的时间与系统时间的差异
     * @return 解密后的字符串
     */
    public static String encrypt(String str, String times, Boolean checkExpire)
    {
        try {
            String key = encodeTime(times,checkExpire);
            return new AesUtil(key).encryptData(str);
        } catch (Exception e) {
            log.error("字符串:{}加密错误，错误信息为:{}",str,e.getMessage());
        }
        return "";
    }
    /**
     * AES加密key生成
     *
     * @param time 前端传递的时间格式: yyyy-MM-dd HH:mm:ss
     * @param checkExpire 是否校验传入的时间与系统时间的差异
     * @return AES加密key
     */
    public static String encodeTime(String time, Boolean checkExpire) throws
            Exception {
//解析前端的时间格式
        LocalDateTime localDateTime = LocalDateTimeUtil.parse(time,
                DatePattern.NORM_DATETIME_PATTERN);
        if(checkExpire){
//避免报文拦截，控制时间在10分钟内传递为正确
            long until = localDateTime.until(LocalDateTime.now(),
                    ChronoUnit.MINUTES);
            if (until > 10){
                throw new Exception("login.password.decode.error");
            }
        }
//生成打乱的时间字符串
        String key =
                localDateTime.format(DateTimeFormatter.ofPattern("yyyyMMddHHmmss"));
        return DigestUtil.md5Hex(key);
    }
    /**
     加密的时间秘钥:2022-03-25 16:34:34
     需要加密的key:admin
     基于秘钥：2022-03-25 16:34:34加密key:admin的结果为:4izN3lfflV7aRKwGM79dAA==
     基于秘钥：2022-03-25 16:34:34解密key:4izN3lfflV7aRKwGM79dAA==的结果为:admin
     **/
    public static void main(String[] args) {
        String encodeKey = LocalDateTimeUtil.format(LocalDateTime.now(),
                DatePattern.NORM_DATETIME_PATTERN);
        System.out.println("加密的时间秘钥:" + encodeKey);
        String key = "admin,1,1,2025-03-17 15:02:06,1";
        System.out.println("需要加密的key:" + key);
        String encrypt = AuthAesUtil.encrypt(key, encodeKey, true);
        System.out.println(String.format("基于秘钥：%s加密key:%s的结果为:\n%s",encodeKey,key,encrypt));
        String decrypt = AuthAesUtil.decrypt(encrypt, encodeKey, true);
        System.out.println(String.format("基于秘钥：%s解密key:%s的结果为:\n%s",encodeKey,encrypt,decrypt));
    }
}
